/**
 * 行编辑配置
 */
export interface IRowEditable {
  /** 数据行是否正编辑 */
  edit?: boolean;
  /** 数据行编辑的索引，和列索引匹配 */
  editIndex?: number;
}

export type ExtraColor = "blue" | "green" | "yellow" | "red" | "gray" | string;

/**
 * 列配置
 */
export interface IColumn<T = any> {
  /** 表头 */
  title: any;
  /**
   * 宽度
   * @default 100
   */
  width?: number;
  /**
   * 自定义单元格显示的内容
   */
  render?: (col: any, item: T, index: number) => any;
  /**
   * 列数据索引
   */
  dataIndex?: string;
  /**
   * @warning 必须指定，且每列唯一
   */
  key: string | number;
  /**
   * 单元格是否可编辑
   * @warning 只有字符串和数字可编辑, 否则可能会产生错误crash页面，由于是内部组件，不做过多校验影响性能，必须严格传参保证组件稳定性
   */
  editable?: boolean | ((col: any, item: T, index: number) => boolean);
  /** 展示额外的信息 */
  extra?: string | ((colValue: any, item: T, index: number) => any);
  /** 展示额外的信息2 */
  extra2?: string | ((colValue: any, item: T, index: number) => any);
  /**
   * 额外信息展示位置
   * @default bottomRight
   */
  extraPlacement?: "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
  /**
   * 额外信息展示颜色
   * @default blue
   */
  extraColor?: ExtraColor;
  /**
   * title样式
   * @TODO: 修改为style
   */
  style?: React.CSSProperties;
  /**
   * 子级合并
   */
  children?: IColumn<any>[];
  /**
   * 列合并
   * @returns
   */
  colSpan?: (val: any, data: T, index: number) => number | undefined;
  /**
   * 行合并
   * @returns
   */
  rowSpan?: (val: any, data: T, index: number) => number | undefined;
  /**
   * 列固定
   */
  fixed?: "left" | "right";
  /**
   * 排序函数
   * @param a
   * @param b
   * @returns
   */
  sorter?: (a: any, b: any) => number;
  /**
   * 排序方向
   */
  sortDirections?: Array<"ascend" | "descend">;
  /**
   * 底部展示数据
   */
  footerValue?: string | ((colValue: any, item: T, index: number) => any);
  /**
   * 单元格样式
   */
  bodyCellStyle?: React.CSSProperties;
}

/** 每一行的聚焦状态 */
export interface FocusCell {
  /** 是否正编辑 */
  edit: boolean;
  /** 列 */
  colKey: string | number;
}

export type ColFixeds = Record<
  string,
  {
    isLeft?: boolean;
    isRight?: boolean;
    first?: boolean;
    offset: number;
  }
>;
